package com.aspire.aimini.service;

import com.aspire.aimini.model.dto.CopywritingDTO;
import com.aspire.aimini.model.query.CopywritingQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;
import java.util.Map;

/**
 * 文案Service接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description 文案业务逻辑接口
 */
public interface CopywritingService {

    /**
     * 分页查询文案列表
     *
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<CopywritingDTO> getCopywritingPage(CopywritingQuery query);

    /**
     * 根据ID获取文案详情
     *
     * @param id     文案ID
     * @param userId 用户ID
     * @return 文案详情
     */
    CopywritingDTO getCopywritingById(Long id, Long userId);

    /**
     * 生成文案
     *
     * @param materialId   素材ID
     * @param contentType  内容类型
     * @param style        风格
     * @param customPrompt 自定义提示词
     * @param userId       用户ID
     * @return 生成的文案
     */
    CopywritingDTO generateCopywriting(Long materialId, String contentType, String style, String customPrompt,
            Long userId);

    /**
     * 更新文案信息
     *
     * @param id         文案ID
     * @param title      标题
     * @param content    内容
     * @param isFavorite 是否收藏
     * @param userId     用户ID
     * @return 更新后的文案
     */
    CopywritingDTO updateCopywriting(Long id, String title, String content, Boolean isFavorite, Long userId);

    /**
     * 删除文案
     *
     * @param id     文案ID
     * @param userId 用户ID
     */
    void deleteCopywriting(Long id, Long userId);

    /**
     * 批量删除文案
     *
     * @param ids    文案ID列表
     * @param userId 用户ID
     */
    void batchDeleteCopywriting(List<Long> ids, Long userId);

    /**
     * 根据素材ID获取文案列表
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 文案列表
     */
    List<CopywritingDTO> getCopywritingByMaterialId(Long materialId, Long userId);

    /**
     * 增加文案使用次数
     *
     * @param id     文案ID
     * @param userId 用户ID
     */
    void incrementUseCount(Long id, Long userId);

    /**
     * 获取用户收藏的文案列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 分页结果
     */
    IPage<CopywritingDTO> getFavoriteCopywriting(Long userId, Integer page, Integer size);

    /**
     * 获取最近创建的文案
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 文案列表
     */
    List<CopywritingDTO> getRecentCopywriting(Long userId, Integer limit);

    /**
     * 搜索文案
     *
     * @param keyword 关键词
     * @param userId  用户ID
     * @param limit   限制数量
     * @return 文案列表
     */
    List<CopywritingDTO> searchCopywriting(String keyword, Long userId, Integer limit);

    /**
     * 获取热门文案
     *
     * @param limit 限制数量
     * @return 文案列表
     */
    List<CopywritingDTO> getPopularCopywriting(Integer limit);

    /**
     * 按内容类型统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByContentType(Long userId);

    /**
     * 按风格统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByStyle(Long userId);

    /**
     * 按AI模型统计文案数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByAiModel(Long userId);

    /**
     * 获取用户文案统计信息
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    Map<String, Object> getUserCopywritingStats(Long userId);

    /**
     * 统计用户每日文案生成数量
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计结果
     */
    List<Map<String, Object>> countDailyCopywriting(Long userId, Integer days);

    /**
     * 清理过期的临时文案
     *
     * @return 清理数量
     */
    int cleanExpiredTempCopywriting();

    /**
     * 复制文案
     *
     * @param id     文案ID
     * @param userId 用户ID
     * @return 复制的文案
     */
    CopywritingDTO copyCopywriting(Long id, Long userId);

    /**
     * 重新生成文案
     *
     * @param id     文案ID
     * @param userId 用户ID
     * @return 重新生成的文案
     */
    CopywritingDTO regenerateCopywriting(Long id, Long userId);

    /**
     * 批量生成文案
     *
     * @param materialIds 素材ID列表
     * @param contentType 内容类型
     * @param style       风格
     * @param userId      用户ID
     * @return 生成的文案列表
     */
    List<CopywritingDTO> batchGenerateCopywriting(List<Long> materialIds, String contentType, String style,
            Long userId);

    /**
     * 导出文案
     *
     * @param ids    文案ID列表
     * @param format 导出格式
     * @param userId 用户ID
     * @return 导出文件路径
     */
    String exportCopywriting(List<Long> ids, String format, Long userId);

    /**
     * 获取可用的内容类型列表
     *
     * @return 内容类型列表
     */
    List<String> getAvailableContentTypes();

    /**
     * 获取可用的风格列表
     *
     * @return 风格列表
     */
    List<String> getAvailableStyles();
}